package org.example.onlinejudge.repository;

import org.example.onlinejudge.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
 * 用户数据访问接口
 * 负责提供用户数据的CRUD操作和自定义查询
 * 实现逻辑：
 * 1. 继承JpaRepository，提供基本的CRUD操作
 * 2. 提供根据用户名查找用户的方法（包含角色和权限信息）
 * 3. 提供根据邮箱查找用户的方法
 * 4. 提供检查用户名和邮箱是否存在的方法
 * 5. 使用@Query注解自定义JPQL查询，解决N+1查询问题
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查找用户（包含角色和权限信息）
     */
    @Query("SELECT DISTINCT u FROM User u LEFT JOIN FETCH u.roles r LEFT JOIN FETCH r.permissions LEFT JOIN FETCH u.permissions WHERE u.username = :username")
    Optional<User> findByUsernameWithRoles(@Param("username") String username);

    /**
     * 根据ID查找用户（包含角色和权限信息）
     */
    @Query("SELECT DISTINCT u FROM User u LEFT JOIN FETCH u.roles r LEFT JOIN FETCH r.permissions LEFT JOIN FETCH u.permissions WHERE u.id = :id")
    Optional<User> findByIdWithRoles(@Param("id") Long id);

    /**
     * 根据用户名查找用户
     */
    Optional<User> findByUsername(String username);

    /**
     * 根据邮箱查找用户
     */
    Optional<User> findByEmail(String email);

    /**
     * 检查用户名是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     */
    boolean existsByEmail(String email);
}


